#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define AddParam 10

//extern int testGoto();
//extern int testRecursion();
//extern int testType();
//extern int testIgnore();
//extern int testG();
//extern int testString();
extern int testAdd();
extern int g();

// typedef C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称，来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等。
//一旦用户在程序中定义了自己的数据类型名称，就可以在该程序中用自己的数据类型名称来定义变量的类型、数组的类型、指针变量的类型与函数的类型等。此时LL就是char型了，平常我们用char c = 'a' OR LL = 'a'
// 使用场景：为基本数据类型定义新的类型名
/**
 *  1)、也就是说，系统默认的所有基本类型都可以利用 typedef 关键字来重新定义类型名，示例代码如下所示：typedef unsigned int COUNT;
    而且，我们还可以使用这种方法来定义与平台无关的类型。比如，要定义一个叫 REAL 的浮点类型，在目标平台一上，让它表示最高精度的类型，即：typedef long double REAL;
    在不支持 long double 的平台二上，改为：typedef double REAL;
    甚至还可以在连 double 都不支持的平台三上，改为：typedef float REAL;
    这样，当跨平台移植程序时，我们只需要修改一下 typedef 的定义即可，而不用对其他源代码做任何修改。其实，标准库中广泛地使用了这个技巧，比如 size_t 在 VC++2010 的 crtdefs.h 文件中的定义如下所示：#ifndef _SIZE_T_DEFINED

    #ifdef _WIN64
    typedef unsigned __int64 size_t;
    #else
    typedef _W64 unsigned int size_t;
    #endif
    #define _SIZE_T_DEFINED
    #endif

    还可以用于结构体上的使用，如：
    struct tagPoint { double x; double y; double z; };
    其中，struct 关键字和 tagPoint 一起构成了这个结构类型，无论是否存在 typedef 关键字，这个结构都存在。
    2)、使用 typedef 为这个新的结构起了一个别名，叫 Point，即：typedef struct tagPoint Point
    因此，现在你就可以像 int 和 double 那样直接使用 Point 定义变量，如下面的代码所示：Point oPoint1={100，100，0};
    Point oPoint2;
 * */
typedef char LL;

int main()
{
    // 使用全局变量的时候，需要使用extern外部标识符的，验证了全局变量的作用域是整个工程的
//    extern int global;

//    extern int sum;

//    extern int result;

    // printf("global = %d\n", global);

    // printf("sum = %d\n", sum);

    // printf("result = %d\n", result);

    // 作用域  1.局部变量的作用是变量所在的局部范围 2.全局变量的作用域是整个工程
    // 生命周期 全局变量的生命周期是： 1.进入作用域生命周期开始，出作用域生命周期结束。 2.整个程序的生命周期。

    // printf("%d\n",AddParam);

//     testGoto();

//     testG();

    // int num = testRecursion(1);
    // printf("猴子第一天摘了:%d个桃子。\n", num);

//    scanf()是C语言提供的
//    scanf_s是vs编译器提供的，不是标准C语言提供的。使用了，就不具有跨平台性和可移植性
//    int a = 2,i;
//    for (int i = 0; i < 3; i++)
//    {
//        printf("%d\n", testType(a));
//    }

//    int aa = testIgnore();

//    printf("%d\n",aa);

//    testString();
//    char str[] = "bit";
//    char str1[20] = "########";
//    printf("%s\n",str);
//    strcpy(str,str1);
//    printf("%s\n",str);
//
//     mem内存 set设置
//    char arr[] = "hello world";
//    memset(arr, '*',5);
//    printf("%s\n",arr);

//    const int a = 32;
//
//    char b = 'G';
//
//    extern int z;
//    extern int x;
//
//    LL C = 'a';
//
//    printf("%c\n",C);
//    printf("Hello world!\n");
//
//    x = 2;
//    z = 5;
//
//    printf("These are the modified values of the extern variables"
//           " 'x' and 'z' respectively: %d and %d\n", x, z);
//
//    printf("The value of static variable 'y' is NOT initialized to 5 after the "
//           "first iteration! See for yourself :)\n");
//
//    while (x>0){
//        static int y = 5;
//        y++;
//        printf("y= %d\n",y);
//        x--;
//    }
//
//    testAdd(5);
//
//    printf("Bye! See you soon. :)\n");
//
//    printf("%d", g());
//    printf("\n");

    int a = 456;
    {
        printf("%d\n",a);
        // 外部变量到这里结束
        int a = 123;
        // 所以此时下面输出的是块内部变量的值
        printf("%d\n",a);
        // 到下面大括号的时候，内部变量的值的有效性也就结束了
    }
    // 这里输出的外部变量a的值
    printf("%d\n",a);
    return (0);
}